import os
import re
import datetime
from functools import reduce

from pathlib import Path
import pandas as pd
from pandas import DataFrame, Series
from datetime import datetime
from pathlib import Path

import logging

logging.basicConfig(
    level=logging.DEBUG,
    # 格式说明：
    # %(levelname)8s → 右对齐，总宽度8个字符
    format='%(levelname)8s: %(message)s'
)


# 文档 = '([^-\.]+)'
# 班级 = '([^-\.]+)'
# 学号 = '([0-9]{11})'
# 姓名 = '([^-\.]+)'
# 日期 = '([0-9]{4})'
# 后缀 = '([^-\.]+)'
# PATTERN_报告 = (
#     r'^'
#     f"{文档}"
#     f"-{班级}"
#     f"-{学号}"
#     f"-{姓名}"
#     f".{日期}"
#     f".{后缀}"
#     r'$'
# )
# PATTERN_视频 = (
#     r'^'
#     f"{班级}"
#     f"-{学号}"
#     f"-{姓名}"
#     f".{日期}"
#     f".{后缀}"
#     r'$'
# )


def get_files_name(folder_path, file_types=['.doc', '.docx', '.pdf'], return_type="name_only") -> pd.Series:
    logging.debug("in get_files_name()")
    """
    获得指定目录下的所有指定类型文件的名称

    参数:
        folder_path: 要搜索的目录路径
        file_types: 要包含的文件扩展名列表 (例如 ['.docx', '.pdf'] 或 ['.mp4'])
        return_type: 返回的文件名格式 ("name_only", "full_path", "relative")

    返回:
        pd.Series: 包含所有匹配文件名的Series
    """
    try:
        # 验证文件夹是否存在
        if not os.path.isdir(folder_path):
            logging.error(f"文件夹不存在 - {folder_path}")
            return pd.Series([], name='文件名')

        folder = Path(folder_path)
        matched_files = []
        file_types = [ext.lower() for ext in file_types]  # 统一小写处理

        # 收集所有匹配的文件
        for item in folder.iterdir():
            if item.is_file() and item.suffix.lower() in file_types:

                # 根据返回类型处理路径
                if return_type == "name_only":
                    matched_files.append(item.name)
                elif return_type == "full_path":
                    matched_files.append(str(item.absolute()))
                elif return_type == "relative":
                    matched_files.append(str(item.relative_to(folder)))
                else:
                    # 默认返回完整路径
                    matched_files.append(str(item.absolute))

        # 按文件名排序
        matched_files.sort()

        logging.debug(f"在 {folder_path} 中找到 {len(matched_files)} 个 {file_types} 文件")
        return pd.Series(matched_files, name='文件名')

    except Exception as e:
        logging.error(f"获取文件列表时出错: {str(e)}")
        return pd.Series([], name='文件名')


def check_filename_format(se_filename, pattern: str):
    logging.debug("in check_filename_format()")
    invalid_strings = []

    for s in se_filename:
        if not bool(re.match(pattern, s)):
            invalid_strings.append(s)

    if invalid_strings:
        logging.debug("以下字符串不符合格式要求:")
        for s in invalid_strings:
            logging.debug(f"  - {s}")
        logging.error(f"\n总计: {len(invalid_strings)} 个字符串不符合规则")
        exit(0)
    else:
        logging.info("所有字符串都符合格式要求!")


def has_duplicates(items: Series) -> bool:
    """查找并打印Series中的重复项"""
    # 计算每个值的出现次数
    value_counts = items.value_counts()

    # 找出重复项（出现次数大于1）
    duplicates = value_counts[value_counts > 1]

    if not duplicates.empty:
        logging.info(f"列表中有 {len(duplicates)} 个重复项:")
        for i, (value, count) in enumerate(duplicates.items(), 1):
            logging.info(f"{i}. {value} (出现次数: {count})")
        return True # 存在重复项
    else:
        return False # 不存在重复项



